home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 326-350 / disk_349 / med / source / med200src.zoo / med-newmsgh.c < prev    next >
C/C++ Source or Header  |  1990-04-08  |  23KB  |  746 lines

  1. /* MED-newmsgh.c --- viestien käsittely (V2.00:sta alkaen) */
  2. /* Uuden msghandlerin kirjoittamisen urakka aloitettu 12.10.1989 */
  3. #include <hardware/custom.h>
  4. #include "med.h"
  5. #define    SHIFT    (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT)
  6. #define ALT    (ALTLEFT|ALTRIGHT)
  7. extern struct CIA far ciaa;
  8. extern struct Custom far custom;
  9. extern struct Image pylvasimage;
  10. extern struct RastPort *wrp;
  11. extern struct Kappale far tamakappale;
  12. extern struct Window *window,*pw;
  13. extern struct NewWindow far pnw;
  14. extern struct Screen *screen;
  15. extern struct StringInfo strinfo[];
  16. extern struct PropInfo far propinfo[];
  17. extern struct Image far kuviot,far loadgadgimg,far savegadgimg;
  18. extern struct Gadget far gadget1[],far gadget2[],far gadget3[],far gadget4[];
  19. extern struct Gadget far gadget5[],far gadget6[],far gadget9[],far *glists[];
  20. extern struct Gadget far gadget7[],far gadgetA[];
  21. extern UWORD *imgdataptr[],far nappokt,chip mouse0[],chip mouse1[];
  22. extern BOOL naytonpaivitys,aanipaalla[];
  23. extern LONG pylvasalku0;
  24. extern void __asm PaivitaNaytto(register __d0 BOOL);
  25. extern void __asm Korosta(register __a0 struct Gadget *,register __d0 BOOL);
  26. extern char kappaleennimi[];
  27. extern UBYTE firstdisptrk,thiscol;
  28. UWORD nykyinenosio;
  29. UBYTE far klevx[] = { 0,0,0,0,24,0,0,0,8,8,8,8,0,24,0,0,0,8,8,8,8,0,24,0,0,0,
  30.               8,8,8,8,0,24,0,0,0,8,8,8,8,0 };
  31. UBYTE far midiactive = 0;
  32. UWORD lohkoja,soittimennum = 1,kursorix = 4,currtrk = 0,currpos = 0;
  33. BOOL ilmoitusnakyy = FALSE;
  34. UWORD volatile tempo = 60,soittorivi,soittolohko,soittolohkonnum,soittotila;
  35. struct Lohko far *lohko[100];
  36. BOOL KasitteleGadget();
  37. static BOOL KasitteleOsio7();
  38. void OsionValinta(),KasitteleNappain();
  39. static void KasitteleOsio2(),KasitteleOsio3(),KasitteleOsio4();
  40. static void KasitteleOsio5(),KasitteleOsio6(),HandlePlainKey();
  41. static void KasitteleOsio9(),KasitteleOsioA();
  42. static UBYTE f5_10line[5] = { 0,16,32,48,63 },waitsomething;
  43. static char *abouttxt[] = {    "MED2.00 by Teijo Kinnunen, 1990",
  44.     "Address: Oksantie 19...","SF-86300  OULAINEN, FINLAND",
  45.     "IFF 8SVX loader by S. Hayes","Then some greetings:",
  46.     "Greetings to Topi & Osku","and of course, to Erkki Hannila",
  47.     "MED is in Public Domain","Copy me!!!",
  48.     "The End." };
  49. BOOL __asm KasitteleViesti(register __d0 ULONG luokka,
  50.             register __d1 UWORD koodi,register __d2 UWORD qual,
  51.             register __a0 APTR osoite)
  52. {
  53.     if(waitsomething) {
  54.         if(waitsomething == 1 && pw) {
  55.             if(luokka == MOUSEBUTTONS && koodi == SELECTUP) return(0);
  56.             pylvasalku0 = 0L; CloseWindow(pw); pw = NULL;
  57.             Korosta(&gadget3[6],(BOOL)pylvasalku0); }
  58.         waitsomething = 0;
  59.     }
  60.     if(ilmoitusnakyy && (!(luokka == MOUSEBUTTONS && koodi ==
  61.         SELECTUP) && (luokka != RAWKEY || (luokka == RAWKEY &&
  62.         !(koodi & 0x80)))))    Ilmoita(NULL);
  63.     switch(luokka) {
  64.         case RAWKEY:
  65.             KasitteleNappain(koodi,qual);
  66.             break;
  67.         case GADGETDOWN:
  68.         case GADGETUP:
  69.             return(KasitteleGadget(osoite));
  70.         case MOUSEBUTTONS:
  71.             if(koodi == MENUDOWN) {
  72.                 ShowTitle(screen,naytonpaivitys);
  73.                 if(!(naytonpaivitys = !naytonpaivitys)) {
  74.                     RemEqualizer();
  75.                     RemCopperList();
  76.                 } else if(gadget3[21].GadgetID & 0x1000)
  77.                     InitEqualizer();
  78.             }
  79.     }
  80.     return(0);    /* ei lopu */
  81. }
  82.  
  83. BOOL KasitteleGadget(APTR addr)
  84. {
  85.     UWORD gid = (((struct Gadget *)addr)->GadgetID) & 0xfff;
  86.     switch(gid & 0xf00) {
  87.         case 0x100:    OsionValinta((struct Gadget *)addr); break;
  88.         case 0x200:    KasitteleOsio2(gid);    break;
  89.         case 0x300:    KasitteleOsio3(gid);    break;
  90.         case 0x400:    KasitteleOsio4(gid);    break;
  91.         case 0x500:    KasitteleOsio5(gid);    break;
  92.         case 0x600:    KasitteleOsio6(gid);    break;
  93.         case 0x700:    return(KasitteleOsio7(gid));    break;
  94.         case 0x900:    KasitteleOsio9(gid);    break;
  95.         case 0xA00:    KasitteleOsioA(gid);    break;
  96.         case 0xF00:
  97.             if(gid == 0xF00) KasitteleOsio6(0x600);
  98.             else if(gid == 0xF01) KasitteleOsio6(0x601);
  99.             else if(gid == 0xF02) {
  100.                 if(nappokt < 3) KasitteleOsio6(nappokt + 0x613);
  101.                 else KasitteleOsio6(0x612);
  102.             }
  103.     }
  104.     return(0);
  105. }
  106.  
  107. void KasitteleNappain(UWORD koodi,UWORD qual)
  108. {
  109.     if(qual & IEQUALIFIER_CONTROL) {
  110.         switch(koodi) {
  111.             case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55:
  112.                 OsionValinta(&gadget1[koodi - 0x50]);
  113.                 return;
  114.             case 0x57: OsionValinta(&gadget1[6]); return;
  115.             case 0x58: OsionValinta(&gadget1[7]); return;
  116.             case 0x05: case 0x06:
  117.                 if(qual & SHIFT) EditHandler(koodi+0x100);
  118.                 else KasitteleOsio3(0x302 + koodi);
  119.                 break;
  120.             case CURSORLEFT:
  121.                 if(firstdisptrk)    firstdisptrk -= 4;
  122.                 else    firstdisptrk = lohko[soittolohko]->numtracks - 4;
  123.                 currtrk = firstdisptrk + currpos;
  124.                 PaivitaNaytto(TRUE);    DispInfoGadgets();
  125.                 break;
  126.             case CURSORRIGHT:
  127.                 firstdisptrk += 4;
  128.                 if(firstdisptrk >= lohko[soittolohko]->numtracks)
  129.                     firstdisptrk = 0;
  130.                 currtrk = firstdisptrk + currpos;
  131.                 PaivitaNaytto(TRUE);    DispInfoGadgets();
  132.                 break;
  133.             case 0x3E: KasitteleOsio3(0x30C); break;
  134.             case 0x1E: KasitteleOsio3(0x30D); break;
  135.             case 0x3D: KasitteleOsio3(0x30E); break;
  136.             case 0x1D: KasitteleOsio3(0x30F); break;
  137.             case 0x2D: KasitteleOsio3(0x311); break;
  138.             case 0x2F: KasitteleOsio3(0x310); break;
  139.             case 0x0F: KasitteleOsio3(0x312); break;
  140.             case 0x3C: KasitteleOsio3(0x313); break;
  141.             case 0x2E: KasitteleOsio3(0x314); break;
  142.             case 0x20: KasitteleOsio6(0x619); break;
  143.             case 0x13: RetFileName(); break;
  144.             case 0x37: SetMark(); break;
  145.             case 0x32: case 0x33: case 0x34:
  146.                 HandleMark(koodi); break;
  147.             default: if((qual & SHIFT) && koodi >= 0x01 &&
  148.                    koodi <= 0x0A) EditHandler(koodi+0x100);
  149.                  else HandlePlainKey(koodi,qual);
  150.         }
  151.     }
  152.     else if(qual & AMIGAKEYS) {
  153.         if(koodi == 0x28) KasitteleOsio2(0x214);
  154.         else if(koodi == 0x17) {
  155.             OsionValinta(&gadget1[2]);
  156.             if(qual & SHIFT) {
  157.                 tamakappale.soitin[soittimennum][0] = 0;
  158.                 RefreshGList(&gadget4[0],window,NULL,1);
  159.             }
  160.             ActivateGadget(&gadget4[0],window,NULL);
  161.         }
  162.         else if(koodi == 0x23) KasitteleOsio3(0x305);
  163.         else if(koodi == 0x26) KasitteleOsio4(0x406);
  164.         else if(koodi == 0x33) KasitteleOsio5(qual&SHIFT?0x50D:0x50A);
  165.         else if(koodi == 0x32) KasitteleOsio5(qual&SHIFT?0x50E:0x50B);
  166.         else if(koodi == 0x34) KasitteleOsio5(qual&SHIFT?0x50F:0x50C);
  167.         else if(koodi == 0x19) KasitteleOsio3(0x300);
  168.         else if(koodi == 0x13 && nykyinenosio == 4)
  169.             ActivateGadget(&gadget4[8],window,NULL);
  170.         else HandlePlainKey(koodi,qual);
  171.     }
  172.     else if((qual & SHIFT) && (qual & ALT)) {
  173.         if(koodi >= 0x50 && koodi <= 0x59) Ilmoita(abouttxt[koodi-0x50]);
  174.         else if(koodi == 0x40) KasitteleOsio3(0x300);
  175.         else HandlePlainKey(koodi,qual);
  176.     }
  177.     else if(qual & SHIFT) {
  178.         switch(koodi) {
  179.             case 0x40: KasitteleOsio3(0x303); break;
  180.             case 0x1D: case 0x1E: case 0x1F:
  181.                 KasitteleOsio6(0x5ED+koodi);    break;
  182.             case 0x2D: case 0x2E: case 0x2F:
  183.                 KasitteleOsio6(0x5E0+koodi);    break;
  184.             case 0x3D: case 0x3E: case 0x3F:
  185.                 KasitteleOsio6(0x5D3+koodi);    break;
  186.             default:
  187.                 if((koodi >= 0x01 && koodi <= 0x0A) ||
  188.                     koodi == 0x46)
  189.                     EditHandler(koodi);
  190.                 else HandlePlainKey(koodi,qual);
  191.         }
  192.     }
  193.     else if(qual & ALT) {
  194.         if(koodi == 0x40) KasitteleOsio3(0x304);
  195.         else HandlePlainKey(koodi,qual);
  196.     }
  197.     else if(koodi == 0x40) KasitteleOsio3(0x302); /* Stop playing */
  198.     else HandlePlainKey(koodi,qual);
  199. }
  200.  
  201. static void HandlePlainKey(UWORD koodi,UWORD qual)
  202. {
  203.     switch(koodi) {
  204.         case CURSORUP:
  205.             if(qual & SHIFT) KasitteleOsio5(0x509);
  206.             else if(qual & ALT) KasitteleOsio5(0x506);
  207.             else {
  208.                 if((gadget6[1].GadgetID & 0x1000) &&
  209.                     !(soittorivi & 0x01) && soittorivi-- == 0)
  210.                         soittorivi = 63;
  211.                 if(soittorivi-- == 0) { soittorivi = 63; PaivitaNaytto(FALSE); }
  212.                 else PaivitaNaytto(FALSE);
  213.             }
  214.             break;
  215.         case CURSORDOWN:
  216.             if(qual & SHIFT) KasitteleOsio5(0x508);
  217.             else if(qual & ALT) KasitteleOsio5(0x507);
  218.             else {
  219.                 if((gadget6[1].GadgetID & 0x1000) &&
  220.                     !(soittorivi & 0x01)) soittorivi++;
  221.                 if(++soittorivi > 63) { soittorivi -= 64; PaivitaNaytto(FALSE); }
  222.                 else PaivitaNaytto(FALSE);
  223.             }
  224.             break;
  225.         case CURSORLEFT:
  226.             if(qual & SHIFT) {
  227.                 if(qual & ALT) {
  228.                     soittimennum = (soittimennum > 16 ?
  229.                         16 : 1);
  230.                     PaivitaSoittimennimi();
  231.                 } else EdSoitin();
  232.             } else {
  233.                 NaytaKursori();
  234.                 if(qual & ALT) {
  235.                     if(kursorix == currpos * 9 + 4)
  236.                         if(!currpos--) currpos = 3;
  237.                     kursorix = currpos * 9 + 4;
  238.                 }
  239.                 else if(kursorix == 4) kursorix = 38;
  240.                 else {
  241.                     kursorix--;
  242.                     if(!klevx[kursorix])
  243.                         while(!klevx[--kursorix]);
  244.                 }
  245.                 currpos = (kursorix<12?0:(kursorix<21?1:(kursorix<30?2:3)));
  246.                 currtrk = firstdisptrk + currpos;
  247.                 NaytaKursori();
  248.             }
  249.             break;
  250.         case CURSORRIGHT:
  251.             if(qual & SHIFT) {
  252.                 if(qual & ALT) {
  253.                     soittimennum = (soittimennum < 15 ?
  254.                         15 : 31);
  255.                     PaivitaSoittimennimi();
  256.                 } else SeurSoitin();
  257.             } else {
  258.                 NaytaKursori();
  259.                 if(qual & ALT) {
  260.                     if(++currpos > 3) currpos = 0;
  261.                     kursorix = currpos * 9 + 4;
  262.                 }
  263.                 else if(kursorix == 38) kursorix = 4;
  264.                 else {
  265.                     kursorix++;
  266.                     if(!klevx[kursorix])
  267.                         while(!klevx[++kursorix]);
  268.                 }
  269.                 currpos = (kursorix<12?0:(kursorix<21?1:(kursorix<30?2:3)));
  270.                 currtrk = firstdisptrk + currpos;
  271.                 NaytaKursori();
  272.             }
  273.             break;
  274.         case 0x50: case 0x51: case 0x52: case 0x53: case 0x54:
  275.             KasitteleOsio6(0x5C2+koodi);    break;
  276.         case 0x55: case 0x56: case 0x57: case 0x58: case 0x59:
  277.             soittorivi = (UWORD)(f5_10line[koodi - 0x55]);
  278.             PaivitaNaytto(FALSE);        break;
  279.         case 0x45: /* Esc */ KasitteleOsio6(0x600);    break;
  280.         case 0x1D: case 0x1E: case 0x1F:
  281.             KasitteleOsio6(0x5E5+koodi);    break;
  282.         case 0x2D: case 0x2E: case 0x2F:
  283.             KasitteleOsio6(0x5D8+koodi);    break;
  284.         case 0x3D: case 0x3E: case 0x3F:
  285.             KasitteleOsio6(0x5CB+koodi);    break;
  286.         case 0x5F: Ilmoita("Try Shift+Alt+F1-10!!!"); break;
  287.         case 0:    KasitteleOsio6(0x601); break; /* 2×space */
  288.         default:
  289.             SoitaNappain(koodi,TRUE,qual);
  290.     }
  291. }
  292.  
  293. void OsionValinta(struct Gadget *gd)
  294. {
  295.     UWORD edno = nykyinenosio;
  296.     struct Gadget *scangptr;
  297.     if((gd->GadgetID & 0xff) == nykyinenosio) return; /* ei nykyistä */
  298.     RemoveGList(window,gadget1[10].NextGadget,-1);
  299.     nykyinenosio = 1;    /* Korosta() tarkistaa nykyisen osion */
  300.     if(edno) Korosta(&gadget1[edno >= 0x09 ? edno-3 : edno - 2],FALSE);
  301.     edno = gd->GadgetID & 0xff;
  302.     Korosta(&gadget1[edno >= 0x09 ? edno-3 : edno-2],TRUE);
  303.     nykyinenosio = edno;
  304.     kuviot.ImageData = imgdataptr[nykyinenosio];
  305.     DrawImage(&(screen->RastPort),&kuviot,5,18);
  306.     if(nykyinenosio == 2) {
  307.         if(gadget2[10].GadgetID & 0x1000)
  308.             DrawImage(&(screen->RastPort),&loadgadgimg,162,19);
  309.         else    DrawImage(&(screen->RastPort),&savegadgimg,162,19);
  310.     }
  311.     for(scangptr = glists[nykyinenosio];scangptr;scangptr = scangptr->NextGadget)
  312.         if(scangptr->GadgetID & 0x1000) { /* on korostettu */
  313.             scangptr->GadgetID &= ~0x1000; /* korostus pois */
  314.             Korosta(scangptr,TRUE); /* ja korostetaan taas */
  315.         }
  316.     AddGList(window,glists[nykyinenosio],-1,-1,NULL);
  317.     RefreshGList(glists[nykyinenosio],window,NULL,-1);
  318.     switch(nykyinenosio) { /* osiokohtainen näytönpäivitys */
  319.         case 0x2:
  320.             UpdateFReqDsp();    break;
  321.         case 0x4: case 0x5: case 0x9:    /* soitin, lohko, midi */
  322.             PaivitaSoittimennimi();    break;
  323.         case 0x3:  /* soitto */
  324.             TulostaSoittoLohkot(); ShowTempo();    break;
  325.         case 0x6: DispFNnum(); break;
  326.         case 0x7:  /* muut - lootien värit kohdalleen */
  327.             SetAPen(wrp,4);        RectFill(wrp,55,52,62,59);
  328.             SetAPen(wrp,5);        RectFill(wrp,65,52,72,59);
  329.             SetAPen(wrp,6);        RectFill(wrp,75,52,82,59);
  330.             SetAPen(wrp,7);        RectFill(wrp,85,52,92,59);
  331.             SetAPen(wrp,0);        DrawColorGadgets(-1);
  332.             GetUndoColors();    break;
  333.         case 0xA:    PlayTransp(tamakappale.playtransp);
  334.     }
  335. }
  336.  
  337. static void KasitteleOsio2(UWORD gid) /* tiedostot */
  338. {
  339.     switch(gid) {
  340.         case 0x20A:
  341.             Korosta(&gadget2[10],TRUE);
  342.             Korosta(&gadget2[11],FALSE);
  343.             DrawImage(&(screen->RastPort),&loadgadgimg,162,19);
  344.             RemoveGList(window,gadget2[16].NextGadget,-1);
  345.             AddGList(window,&gadget2[17],-1,-1,NULL);
  346.             break;
  347.         case 0x20B:
  348.             Korosta(&gadget2[10],FALSE);
  349.             Korosta(&gadget2[11],TRUE);
  350.             DrawImage(&(screen->RastPort),&savegadgimg,162,19);
  351.             RemoveGList(window,gadget2[16].NextGadget,-1);
  352.             AddGList(window,&gadget2[20],-1,-1,NULL);
  353.             if(gadget2[25].GadgetID & 0x1000) {
  354.                 gadget2[25].GadgetID &= ~0x1000;
  355.                 Korosta(&gadget2[25],TRUE);
  356.             }
  357.             break;
  358.         case 0x214: case 0x215: case 0x216: case 0x217: case 0x218:
  359.         case 0x219: case 0x21A: case 0x21B:
  360.             KasitteleOsio3(0x302); /* Stop playing!!! */
  361.             SetPointer(window,&mouse0[0],23,16,-1,0);
  362.             switch(gid) {
  363.                 case 0x214: LoadSong(kappaleennimi);
  364.                         break;
  365.                 case 0x215: LoadInstrument(kappaleennimi,FALSE);
  366.                         break;
  367.                 case 0x216: STModLoader(kappaleennimi);
  368.                         break;
  369.                 case 0x217: SaveSong(kappaleennimi,FALSE);
  370.                         break;
  371.                 case 0x218: SaveRawSample(kappaleennimi);
  372.                         break;
  373.                 case 0x219: STSongSaver(kappaleennimi);
  374.                         break;
  375.                 case 0x21A: SaveSong(kappaleennimi,TRUE);
  376.                         break;
  377.                 case 0x21B: WriteObj(kappaleennimi);
  378.                         break;
  379.             }
  380.             SetPointer(window,&mouse1[0],23,16,-1,0);
  381.             if(gid != 0x218) ClrFileName();
  382.             break;
  383.         case 0x209:
  384.             break;
  385.         case 0x21C:
  386.             Korosta(&gadget2[25],(BOOL)(gadget2[25].GadgetID &
  387.                 0x1000 ? FALSE : TRUE));
  388.             break;
  389.         default:
  390.             FReqHandler(gid);    
  391.     }
  392. }
  393.  
  394. static void KasitteleOsio3(UWORD gid) /* soitto */
  395. {
  396.     UWORD edsoittotila = soittotila;
  397.     switch(gid) {
  398.         case 0x300:  /* Soita kappale */
  399.             soittorivi = soittolohkonnum = 0;
  400.         case 0x303:  /* Jatka kappaletta */
  401.             soittotila = SOITAKAPPALE;
  402.             soittolohko = tamakappale.soittojarjestys[soittolohkonnum];
  403.             Korosta(&gadget3[0],TRUE);
  404.             Korosta(&gadget3[1],FALSE);
  405.             if(edsoittotila == ALASOITA) ciaa.ciacra |= CIACRAF_START;
  406.             break;
  407.         case 0x301:  /* Soita lohkoa */
  408.             soittorivi = 0;
  409.         case 0x304:  /* Jatka lohkoa */
  410.             soittotila = SOITALOHKO;
  411.             Korosta(&gadget3[0],FALSE);
  412.             Korosta(&gadget3[1],TRUE);
  413.             if(edsoittotila == ALASOITA) ciaa.ciacra |= CIACRAF_START;
  414.             break;
  415.         case 0x302:  /* Soitto seis!! */
  416.             soittotila = ALASOITA;
  417.             Korosta(&gadget3[0],FALSE);
  418.             Korosta(&gadget3[1],FALSE);
  419.             SammutaAanet(999);
  420.             SetPointer(window,&mouse1[0],23,16,-1,0);
  421.             break;
  422.         case 0x305:  /* Suodatin */
  423.             tamakappale.liput ^= LIPPU_SUODATINPAALLA;
  424.             AsetaSuodatin();
  425.             break;
  426.         case 0x306:
  427.             if(!pylvasalku0) {
  428.                 if(screen->Height >= 256) pylvasalku0 =
  429.                   (LONG)(screen->BitMap.Planes[0]+8484);
  430.                 else if(pw = OpenWindow(&pnw)) {
  431.                   DrawImage(pw->RPort,&pylvasimage,0,0);
  432.                   pylvasalku0=(LONG)(screen->BitMap.Planes[0]+1124);
  433.                   waitsomething = 1; }
  434.             }
  435.             else if(screen->Height >= 256) pylvasalku0 = 0L;
  436.             Korosta(&gadget3[6],(BOOL)pylvasalku0);
  437.             break;
  438.         case 0x307: case 0x308:  /* Liu'utus: 5 / 6 */
  439.             tamakappale.vaihtoja = gid - 0x302;
  440.             Korosta(&gadget3[7],(BOOL)(tamakappale.vaihtoja ==
  441.                 6 ? FALSE : TRUE));
  442.             Korosta(&gadget3[8],(BOOL)(tamakappale.vaihtoja ==
  443.                 6 ? TRUE : FALSE));
  444.             break;
  445.         case 0x309: ChgTempo((propinfo[1].HorizPot + 137) / 274 + 1);
  446.                 break;
  447.         case 0x30A: if(tempo > 1) ChgTempo(tempo - 1); break;
  448.         case 0x30B: if(tempo < 240) ChgTempo(tempo + 1); break;
  449.         case 0x30C: if(soittolohkonnum) soittolohkonnum--; break;
  450.         case 0x30D: if(soittolohkonnum <
  451.           tamakappale.kappaleen_pituus) soittolohkonnum++; break;
  452.         case 0x30E: soittolohkonnum = 0; break;
  453.         case 0x30F: soittolohkonnum =
  454.             tamakappale.kappaleen_pituus - 1; break;
  455.         case 0x310: if(soittolohkonnum ==    /* + */
  456.             tamakappale.kappaleen_pituus) {
  457.                 if(tamakappale.kappaleen_pituus < 100) {
  458.                   tamakappale.soittojarjestys[
  459.                   (++tamakappale.kappaleen_pituus)-1] =0;
  460.                 }
  461.                 else DisplayBeep(screen);
  462.             }
  463.             else if(tamakappale.soittojarjestys[
  464.                 soittolohkonnum] < lohkoja-1)
  465.               tamakappale.soittojarjestys[soittolohkonnum]++;
  466.             break;
  467.         case 0x311: if(soittolohkonnum ==    /* - */
  468.             tamakappale.kappaleen_pituus) {
  469.                 if(tamakappale.kappaleen_pituus > 1) {
  470.                     tamakappale.kappaleen_pituus--;
  471.                     soittolohkonnum--;
  472.                 }
  473.             }
  474.             else if(tamakappale.soittojarjestys[soittolohkonnum] > 0)
  475.               tamakappale.soittojarjestys[soittolohkonnum]--;
  476.             break;
  477.         case 0x312: InsertSeq(0); break;
  478.         case 0x313: DelSeq(); break;
  479.         case 0x314: InsertSeq(soittolohko); break;
  480.         case 0x315: Korosta(&gadget3[21],(BOOL)(!(gadget3[21].
  481.                 GadgetID & 0x1000)));
  482.                 if(naytonpaivitys) {
  483.                 if(gadget3[21].GadgetID & 0x1000)
  484.                     InitEqualizer();
  485.                 else { RemEqualizer(); RemCopperList(); }
  486.                 }
  487.                 break;
  488.     }
  489.     if(gid >= 0x30C && gid <= 0x311) {
  490.         TulostaLohkoJaSoitin();
  491.         TulostaSoittoLohkot();
  492.     }
  493. }
  494.  
  495. static void KasitteleOsio5(UWORD gid) /* lohko 1 */
  496. {
  497.     UWORD chgblock;
  498.     switch(gid) {
  499.         case 0x508:  /* seur.lohko */
  500.             if(soittolohko < lohkoja-1) soittolohko++;
  501.             break;
  502.         case 0x506:  /* ens. */
  503.             soittolohko = 1; /* ovelasti tehty, eikö vain */
  504.         case 0x509:  /* ed.lohko */
  505.             if(soittolohko) soittolohko--;
  506.             break;
  507.         case 0x507:  /* viim. */
  508.             soittolohko = lohkoja - 1;
  509.             break;
  510.         case 0x504:  /* Uusi */
  511.             if(lohkoja < 100 && !AllocBlock(lohkoja,4)) lohkoja++;
  512.             TulostaLohkoJaSoitin();
  513.             break;
  514.         case 0x505:  /* Tuhoa viim. */
  515.             if(lohkoja > 1 && soittolohko < lohkoja - 1)
  516.                 FreeBlock(--lohkoja);
  517.             TulostaLohkoJaSoitin();
  518.             break;
  519.         case 0x500:  /* Uusi tähän */
  520.             NewBlockHere(soittolohko,4);
  521.             break;
  522.         case 0x501:  /* Tuhoa tämä */
  523.             DelBlockHere(soittolohko);
  524.             break;
  525.         case 0x50A: case 0x50B: case 0x50C: case 0x50D:
  526.             CutCopyPaste(soittolohko,0,64,currtrk,1,gid-0x50A);
  527.             PaivitaNaytto(TRUE);
  528.             break;
  529.         case 0x50E: case 0x50F: case 0x510: case 0x511:
  530.             CutCopyPaste(soittolohko,0,64,0,lohko[soittolohko]->
  531.                 numtracks,gid - 0x50E);
  532.             PaivitaNaytto(TRUE);
  533.             break;
  534.         case 0x512: case 0x513: case 0x514: case 0x515:
  535.             chgblock = soittolohko;
  536.             if(ChangeBlockSize(chgblock,gid - 0x511))
  537.                 Ilmoita("Probably out of memory!!");
  538.             TulostaLohkoJaSoitin();
  539.             break;
  540.     }
  541.     if(gid >= 0x506 && gid <= 0x509) { /* vaihdettiin lohkoa */
  542.         soittorivi = 0;
  543.         PaivitaNaytto(FALSE);
  544.     }
  545. }
  546.  
  547. static void KasitteleOsio4(UWORD gid) /* soitin */
  548. {
  549.     switch(gid) {
  550.         case 0x401:
  551.             soittimennum = 1;
  552.             PaivitaSoittimennimi();
  553.             break;
  554.         case 0x402:
  555.             soittimennum = 31;
  556.             PaivitaSoittimennimi();
  557.             break;
  558.         case 0x403:
  559.             EdSoitin();
  560.             break;
  561.         case 0x404:
  562.             SeurSoitin();
  563.             break;
  564.         case 0x405:    case 0x400:
  565.             SetPointer(window,&mouse0[0],23,16,-1,0);
  566.             tamakappale.stoisto[soittimennum] =
  567.                 tamakappale.stoistonpit[soittimennum] = 0;
  568.             if(!LoadInstrument(tamakappale.soitin[soittimennum],
  569.                 TRUE)) Ilmoita("Sample is now loaded.");
  570.             PaivitaSoittimennimi();
  571.             SetPointer(window,&mouse1[0],23,16,-1,0);
  572.             break;
  573.         case 0x406:  /* hyppääkö ukko?????????? */
  574.             tamakappale.hyppysoitin ^= 1<<soittimennum;
  575.             if(tamakappale.hyppysoitin & (1<<soittimennum))
  576.                 Korosta(&gadget4[6],TRUE);
  577.             else    Korosta(&gadget4[6],FALSE);
  578.             break;
  579.         case 0x407:    RemoveInstrument();    break;
  580.         case 0x408:    GetRepeat();        break;
  581.         case 0x409:    GetRepLen();        break;
  582.         case 0x40A:
  583.             if(tamakappale.soittimenvoimakkuus[soittimennum])
  584.               tamakappale.soittimenvoimakkuus[soittimennum]--;
  585.             DispVolGadget();
  586.             break;
  587.         case 0x40C:
  588.             if(tamakappale.soittimenvoimakkuus[soittimennum] < 64)
  589.               tamakappale.soittimenvoimakkuus[soittimennum]++;
  590.             DispVolGadget();
  591.             break;
  592.         case 0x40B:
  593.             tamakappale.soittimenvoimakkuus[soittimennum] =
  594.                 (propinfo[2].HorizPot + 512) / 1024;
  595.             DispVolGadget();
  596.             break;
  597.     }
  598. }
  599.  
  600. static void KasitteleOsio6(UWORD gid) /* eli editointi */
  601. {
  602.     if(gid >= 0x612 && gid <= 0x615) {
  603.         Korosta(&gadget6[nappokt + 18],FALSE);
  604.         nappokt = gid - 0x612;
  605.         Korosta(&gadget6[nappokt + 18],TRUE);
  606.     } else if(gid >= 0x602 && gid <= 0x611) {
  607.         Korosta(&gadget6[gid - 0x600],(BOOL)(aanipaalla[gid -
  608.             0x602] = !aanipaalla[gid - 0x602]));
  609.         if(!aanipaalla[gid - 0x602])    SammutaAanet(gid - 0x602);
  610.     } else if(gid == 0x600)
  611.         Korosta(&gadget6[0],(BOOL)(!(gadget6[0].GadgetID & 0x1000)));
  612.     else if(gid == 0x601) Korosta(&gadget6[1],(BOOL)(!(gadget6[1].GadgetID & 0x1000)));
  613.     else if(gid == 0x619) Korosta(&gadget6[25],(BOOL)(!(gadget6[25].GadgetID & 0x1000)));
  614.     else if(gid >= 0x617 && gid <= 0x61C) EditHandler(gid);
  615.     DispInfoGadgets();    /* ^^ jump to local handler routine ^^ */
  616. }
  617.  
  618. static void KasitteleOsio9(UWORD gid)
  619. {
  620.     switch(gid) {
  621.         case 0x900:
  622.             if(gadget9[0].GadgetID & 0x1000) {
  623.                 Korosta(&gadget9[0],FALSE);
  624.                 Korosta(&gadget9[23],FALSE);
  625.                 FreeSerial();
  626.                 midiactive = 0;
  627.             } else if(!GetSerial()) {
  628.                 Korosta(&gadget9[0],TRUE);
  629.                 midiactive = 1;
  630.             }
  631.             break;
  632.         case 0x901:
  633.             if(!tamakappale.midikanava[soittimennum])
  634.                 tamakappale.midikanava[soittimennum] = 1;
  635.             PaivitaSoittimennimi();
  636.             break;
  637.         case 0x902:
  638.             tamakappale.midikanava[soittimennum] = 0;
  639.             PaivitaSoittimennimi();
  640.             break;
  641.         case 0x914:
  642.             if(tamakappale.midipreset[soittimennum])
  643.                 tamakappale.midipreset[soittimennum]--;
  644.             DispPresetGadget();
  645.             break;
  646.         case 0x915:
  647.             tamakappale.midipreset[soittimennum] =
  648.                 (propinfo[3].HorizPot + 254) / 508;
  649.             DispPresetGadget();
  650.             break;
  651.         case 0x916:
  652.             if(tamakappale.midipreset[soittimennum] < 128)
  653.                 tamakappale.midipreset[soittimennum]++;
  654.             DispPresetGadget();
  655.             break;
  656.         case 0x913:
  657.             if(strinfo[5].LongInt < 0 || strinfo[5].LongInt
  658.                 > 128) {
  659.                     DisplayBeep(screen);
  660.             } else    tamakappale.midipreset[soittimennum] =
  661.                     (UBYTE)(strinfo[5].LongInt);
  662.             DispPresetGadget();
  663.             break;
  664.         case 0x917:
  665.             if(midiactive)    { Korosta(&gadget9[23],
  666.                 (BOOL)(!(gadget9[23].GadgetID & 0x1000)));
  667.                 if(gadget9[23].GadgetID & 0x1000)
  668.                     custom.intena = 0x8800; /*RBF on*/
  669.                 else    custom.intena = 0x0800; /*RBF off*/
  670.             }
  671.             break;
  672.         default:
  673.             if(gid >= 0x903 && gid <= 0x912) {
  674.                 tamakappale.midikanava[soittimennum] =
  675.                     gid - 0x902;
  676.                 PaivitaSoittimennimi();
  677.             }
  678.     }
  679. }    
  680.  
  681. static BOOL KasitteleOsio7(UWORD gid)
  682. {
  683.     switch(gid) {
  684.         case 0x70D: case 0x70E: case 0x70F:
  685.             if(gid == 0x70D) tamakappale.liput &= ~LIPPU_HYPPELYPAALLA;
  686.             else if(gid == 0x70E) tamakappale.liput |=
  687.                 (LIPPU_HYPPELYPAALLA|LIPPU_HYPPELYTAHTIIN);
  688.             else {    tamakappale.liput |= LIPPU_HYPPELYPAALLA;
  689.                 tamakappale.liput &= ~LIPPU_HYPPELYTAHTIIN;
  690.             }
  691.             UpdateJumpGadgets();
  692.             break;
  693.         case 0x711: case 0x712: case 0x713:
  694.             if(gadget7[gid - 0x701].GadgetID & 0x1000)
  695.                 Korosta(&gadget7[gid - 0x701],FALSE);
  696.             else {
  697.                 Korosta(&gadget7[16],(BOOL)(gid == 0x711));
  698.                 Korosta(&gadget7[17],(BOOL)(gid == 0x712));
  699.                 Korosta(&gadget7[18],(BOOL)(gid == 0x713));
  700.             }
  701.             break;
  702.         case 0x714:
  703.             KasitteleOsio3(0x302);
  704.             if(gadget7[16].GadgetID & 0x1000) {
  705.                 Korosta(&gadget7[16],FALSE);
  706.                 AlustaKappale(TRUE); PaivitaNaytto(TRUE);
  707.             } else if(gadget7[17].GadgetID & 0x1000) {
  708.                 Korosta(&gadget7[17],FALSE);
  709.                 AlustaKappale(FALSE); PaivitaNaytto(FALSE);
  710.             } else if(gadget7[18].GadgetID & 0x1000) {
  711.                 Korosta(&gadget7[18],FALSE);
  712.                 return(1); /* QUIT !!!!!! */
  713.             }
  714.             break;
  715.         default:
  716.             if(gid >= 0x700 && gid <=0x70C) ColorHandler(gid);
  717.     }
  718.     return(0);
  719. }
  720.  
  721. void KasitteleOsioA(UWORD gid)
  722. {
  723.     static BYTE trtb[4] = { 12,1,-1,-12 };
  724.     switch(gid) {
  725.         case 0xA0C: PlayTransp(tamakappale.playtransp - 1); break;
  726.         case 0xA0D: PlayTransp((propinfo[4].HorizPot + 1311) / 2622 - 13); break;
  727.         case 0xA0E: PlayTransp(tamakappale.playtransp + 1); break;
  728.         case 0xA11: case 0xA12:
  729.             Korosta(&gadgetA[17],(BOOL)(gid == 0xA11));
  730.             Korosta(&gadgetA[18],(BOOL)(gid == 0xA12));
  731.             break;
  732.         case 0xA0F: ExpandBlock(soittolohko); break;
  733.         case 0xA10: ShrinkBlock(soittolohko); break;
  734.         default:
  735.             if(gid >= 0xA00 && gid <= 0xA0B)
  736.                 Transpose(trtb[gid & 0x0003],(gid -
  737.                     0xA00) / 4);
  738.             break;
  739.     }
  740. }
  741.  
  742. void MIDIon() /* called by Load120Song if there are any MIDI instruments */
  743. {
  744.     if(!midiactive) KasitteleOsio9(0x900);
  745. }
  746.